OverlayEntries と Route の再構築の最適化
まとめ
この最適化により、ルート遷移のパフォーマンスが向上します。
ただし、それにより、失われた呼び出しが見つかる可能性がありますsetState
あなたのアプリで。
コンテクスト
この変更の前は、OverlayEntry
いつ再構築するか
新しい不透明なエントリがその上に追加されたか、その上から削除されました。
これらの再構築はトリガーされなかったため不要でした
影響を受けた人の状態の変化によってOverlayEntry
。これ
重大な変更により、追加と削除の処理方法が最適化されました。OverlayEntry
s、不要な再構築を削除します。
パフォーマンスを向上させるために。
以来、Navigator
それぞれを内部的に配置しますRoute
にOverlayEntry
この変更は以下にも適用されますRoute
トランジション:
不透明の場合Route
上に押し付けられるか、別の上から取り外されるRoute
、Route
不透明の下にあるRoute
不必要に再構築することがなくなりました。
変更内容の説明
ほとんどの場合、この変更にはコードを変更する必要はありません。
ただし、アプリが誤って暗黙的な依存関係に依存していた場合、
リビルドすると問題が発生する可能性がありますが、ラップすることで解決できます。
の状態変化setState
電話。
さらに、この変更により、形状がわずかに変更されました。
ウィジェット ツリー: この変更前は、
のOverlayEntry
に包まれていましたStack
ウィジェット。
明示的なStack
ウィジェットはウィジェット階層から削除されました。
移行ガイド
Flutter バージョンにアップグレードした後に問題が発生した場合
この変更が含まれている場合は、コードを監査して、setState
。以下の例では、戻り値を代入します。Navigator.pushNamed
にbuttonLabel
は
暗黙的に状態を変更するため、それをラップする必要があります。
明示的なsetState
電話。
移行前のコード:
class FooState extends State<Foo> {
String buttonLabel = 'Click Me';
@override
Widget build(BuildContext context) {
return ElevatedButton(
onPressed: () async {
// Illegal state modification that should be wrapped in setState.
buttonLabel = await Navigator.pushNamed(context, '/bar');
},
child: Text(buttonLabel),
);
}
}
移行後のコード:
class FooState extends State<Foo> {
String buttonLabel = 'Click Me';
@override
Widget build(BuildContext context) {
return ElevatedButton(
onPressed: () async {
final newLabel = await Navigator.pushNamed(context, '/bar');
setState(() {
buttonLabel = newLabel;
});
},
child: Text(buttonLabel),
);
}
}
タイムライン
リリースされたバージョン: 1.16.3
安定版リリース: 1.17
参考文献
API ドキュメント:
setState
OverlayEntry
Overlay
Navigator
Route
OverlayRoute
関連する問題:
- 問題 45797
関連する PR:
- 新しい不透明なルートが上に押し込まれたときにルートを再構築しない
- リランド「新しい不透明なルートが上に押し込まれた場合、ルートを再構築しないでください」